////////////////////////////////////////////////////////////////////////////////
//
// CTTS_SMLDocument CLASS Header file.
//
////////////////////////////////////////////////////////////////////////////////

#ifndef __CTTS_SML_DOCUMENT_H__
#define __CTTS_SML_DOCUMENT_H__

#include <string>
#include "TTS_SMLNode.h"

using std::string;

class CTTS_SMLDocument
{
protected:
	CTTS_SMLNode *m_DocumentRoot;
	string m_XMLVersion;

public:
	CTTS_SMLDocument ()
		{
		m_DocumentRoot = new CTTS_SMLNode (SML_DOCUMENT_NODE,
									"root", "",
									NULL, NULL,
									NULL, NULL, NULL);
		};

	~CTTS_SMLDocument ()
		{
		delete m_DocumentRoot;
		};

	inline CTTS_SMLNode *Root ();

	inline void SetXMLVersion (const char *);

	inline const char *GetXMLVersion ();

	inline void PrintDocument ();

	inline void OutputPlainText ();

	inline void OutputTags (const char * TagName);

	inline void GetPhonemes (CTTS_NaturalLanguageParser *pNLP);
	
	void OutputMbrolaPhonemeFile (const char *Filename);
	void OutputMbrolaPhonemeString (string &MBROLA_Utterance);

	CTTS_SMLNode *NextSection (CTTS_SMLNode *CurrSection);
};

///////////////////////////////////////////////////////////////
// INLINE functions
// 
///////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Root
//
////////////////////////////////////////////////////////////////////////////////
inline CTTS_SMLNode *CTTS_SMLDocument::Root()
{
	return m_DocumentRoot;
}

////////////////////////////////////////////////////////////////////////////////
// SetXMLVersion
//
////////////////////////////////////////////////////////////////////////////////
inline void CTTS_SMLDocument::SetXMLVersion (const char *XMLVersion)
{
	m_XMLVersion = XMLVersion;
}

////////////////////////////////////////////////////////////////////////////////
// GetXMLVersion
//
////////////////////////////////////////////////////////////////////////////////
inline const char *CTTS_SMLDocument::GetXMLVersion ()
{
	return m_XMLVersion.c_str();
}

////////////////////////////////////////////////////////////////////////////////
// PrintDocument
//
////////////////////////////////////////////////////////////////////////////////
inline void CTTS_SMLDocument::PrintDocument ()
{
	m_DocumentRoot->PrintNode();
}

////////////////////////////////////////////////////////////////////////////////
// OutputTags
//
////////////////////////////////////////////////////////////////////////////////
inline void CTTS_SMLDocument::OutputTags (const char *TagName)
{
	Root()->OutputTags (TagName);
}

////////////////////////////////////////////////////////////////////////////////
// OutputPlainText
//
////////////////////////////////////////////////////////////////////////////////
inline void CTTS_SMLDocument::OutputPlainText ()
{
	if (Root())
		Root()->OutputPlainText ();
}

////////////////////////////////////////////////////////////////////////////////
// GetPhonemes
//
////////////////////////////////////////////////////////////////////////////////
inline void CTTS_SMLDocument::GetPhonemes (CTTS_NaturalLanguageParser *pNLP)
{
	Root()->TokenizeContent (pNLP);
	Root()->PhonemizeUtterance (pNLP);
}

#endif